-- ʹ��IEEE��
Library IEEE;
Use IEEE.std_logic_1164.ALL;

-- ʵ�嶨�岿��
ENTITY ConfigurableDownCounter IS
    Generic(
        CounterMax : Integer := 40     -- ��������ʼֵ
    );
    Port(
        clk       : IN  Std_logic;              -- ʱ�������ź�
        enable    : IN  Std_logic;              -- �����ݼ��źţ�'1'ʱ��ʼ�ݼ�
        reset     : IN  Std_logic;
        q_units   : OUT Integer Range 0 to 9;   -- ��λ���������Χ 0-9
        q_tens    : OUT Integer Range 0 to 9;   -- ʮλ���������Χ 0-9
        zero_flag : OUT Std_logic               -- ��������0ʱ������ߵ�ƽ
    );
END ConfigurableDownCounter;

-- ��ϵ�ṹ����
ARCHITECTURE Behavior OF ConfigurableDownCounter IS
    -- �ڲ������������λ��ʮλ
    Signal unit_digit : Integer Range 0 to 9 := CounterMax mod 10;  -- ��λ��
    Signal ten_digit  : Integer Range 0 to 9 := CounterMax / 10;    -- ʮλ��
BEGIN
    -- ���������̿飬ÿ��ʱ�����ڼ�� enable �ź�
    Process(clk)
    Begin
        If (reset = '1') Then
            unit_digit <= CounterMax mod 10;;
            ten_digit  <= CounterMax / 10;
        -- ���� enable Ϊ�ߵ�ƽʱ�ݼ�
        Elsif (clk'Event And clk = '1') Then
            If enable = '1' Then
                -- �����λ������0���ݼ���λ
                If unit_digit > 0 Then
                    unit_digit <= unit_digit - 1;
                Else
                    -- ��λ��Ϊ0�����ʮλ��
                    If ten_digit > 0 Then
                        unit_digit <= 9;      -- ���ø�λ��Ϊ9
                        ten_digit <= ten_digit - 1;  -- �ݼ�ʮλ
                    Else
                        -- ���ʮλ�͸�λ��Ϊ0���򱣳�Ϊ0
                        unit_digit <= 0;
                        ten_digit <= 0;
                    End If;
                End If;
            End If;
        End If;
    End Process;

    -- ����λ��ʮλ��������˿�
    q_units <= unit_digit;
    q_tens <= ten_digit;

    -- ������ֵΪ0ʱ��zero_flag ����ߵ�ƽ����������͵�ƽ
    zero_flag <= '1' when (unit_digit = 0 and ten_digit = 0) else '0';
END Behavior;



